/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exception.DAOEtudiantException;
import dao.exception.DAOPersonneException;
import dao.interfaces.DAOEtudiant;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.sql.Date;
import model.Etudiant;
import model.Cour;
import model.Examen;
import model.Moyenne;
import model.Note;
import model.Personne;

/**
 *
 * @author Paul
 */
public class DAOEtudiantImpl implements DAOEtudiant {

    private DAOInit daoConnection;

    public DAOEtudiantImpl(DAOInit daoConnection) {
        this.daoConnection = daoConnection;
    }

    public ArrayList<Etudiant> getAllEtudiant() throws DAOEtudiantException {
        String query = "SELECT p.id_personne, p.nom, p.prenom, p.dateNaissance, id_eleve FROM personne p,etudiant e where p.typeUtilisateur = 'etudiant' and p.id_personne=e.id_personne";
        ArrayList<Etudiant> etudiants = new ArrayList<Etudiant>();
        Etudiant etudiant = null;
        Integer nb = 0;
        int autoIncKeyFromApi = -1;
        Statement ps = null;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
            while (res.next()) {//récuperation de l'id 
                int ide = res.getInt("id_eleve");
                int id = res.getInt("id_personne");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                Date dateNaissance = res.getDate("dateNaissance");
                etudiant = new Etudiant(ide, id, nom, prenom, dateNaissance, "type", "login", "mdp");
                etudiants.add(etudiant);
            }
            if (etudiants.isEmpty()) {
                throw new DAOEtudiantException("Erreur de récupération des étudiants : veuillez contacter avec l'administrateur du site");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return etudiants;
    }

    public void create(Etudiant obj) throws DAOEtudiantException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int nb = 0;
        int autoIncKeyFromApi = -1;
        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            String query2 = "INSERT INTO `personne`( `nom`, `prenom`, `dateNaissance`, `typeUtilisateur`, `login`, `password`) VALUES (?,?,?,?,?,?);";
            conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query2, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
            ps.setString(1, obj.getNom());
            ps.setString(2, obj.getPrenom());
            ps.setDate(3, obj.getDatenaissance());
            ps.setString(4, obj.getTypeUtilisateur());
            ps.setString(5, obj.getLogin());
            ps.setString(6, obj.getMdp());
            nb = ps.executeUpdate();//lancement de la requête
            rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                String query = "INSERT INTO `etudiant`(`id_personne`) VALUES (" + autoIncKeyFromApi + ");";
                System.out.println(query);
                ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
                nb = ps.executeUpdate();
                System.out.println(nb);
            }

        } catch (SQLException e) {
            throw new DAOEtudiantException("Erreur d'insertion de l'étudiant : veuillez voir avec l'administrateur du site");
        }
    }

    public Etudiant rechercheEtudiant(String login, String mdp) throws DAOEtudiantException {
        PreparedStatement st = null;
        Etudiant p = null;
        try {
            Connection conn = daoConnection.getConnection();
            String query = "select p.login,p.password,p.nom,p.prenom,e.id_eleve,e.id_personne,p.typeUtilisateur from personne p,etudiant e where p.login='" + login + "' and p.password='" + mdp + "' and p.id_personne=e.id_personne;";
            st = conn.prepareStatement(query);
            ResultSet res = st.executeQuery(query);
            if (res.next()) {
                String log = res.getString("login");
                String password = res.getString("password");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                int idp = res.getInt("id_personne");
                int ide = res.getInt("id_eleve");
                String type = res.getString("typeUtilisateur");
                java.sql.Date d = null;
                p = new Etudiant(ide, idp, nom, prenom, d, type, log, password);
                System.out.println(log + ide + idp + type);
            } else {
                throw new DAOEtudiantException("Erreur de connexion : veuillez voir avec l'administrateur du site");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return p;
    }

    public void update(Etudiant obj) {
        String query = "";

    }

    public boolean delete(Personne obj) {
        boolean del = false;
        String query = "DELETE FROM `personne` WHERE `id_personne`=";
        Integer nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            System.out.println(ps);
            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
            ps.setObject(1, obj.getId());
            System.out.println(obj.getId());
            // System.out.println(obj.getId());
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                System.out.println(nb);
            }
            if (nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;
    }

    // @Override
    public ArrayList<Personne> getAll() throws DAOEtudiantException {
        String query = "SELECT id_personne, nom, prenom, dateNaissance FROM personne where typeUtilisateur = 'etudiant'";
        ArrayList<Personne> etudiants = new ArrayList<Personne>();
        Personne personne = null;
        Integer nb = 0;
        int autoIncKeyFromApi = -1;
        Statement ps = null;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
            while (res.next()) {//récuperation de l'id 
                int id = res.getInt("id_personne");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                Date dateNaissance = res.getDate("dateNaissance");
                personne = new Personne(id, nom, prenom, dateNaissance);
                etudiants.add(personne);
            }
            if (etudiants.isEmpty()) {
                throw new DAOEtudiantException("Erreur de récupération des étudiants : veuillez contacter avec l'administrateur du site");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return etudiants;
    }

    public Etudiant find(int id) {
        String query = "";
        Etudiant etudiant = null;
        etudiant = findGeneral(query).get(0);
        return etudiant;
    }

//---------------------------------------------------------private method--------------------------------------------------------------------//
    /**
     * Permet la suppression d'une entrée de la base
     *
     * @param obj
     */
    private ArrayList<Etudiant> findGeneral(String requete) {
        ArrayList<Etudiant> etudiants = new ArrayList<Etudiant>();
        Statement st = null;
        Etudiant etudiant = null;
        return etudiants;
    }

    public ArrayList<Cour> findCours(int idEleve) throws SQLException {
        PreparedStatement st = null;
        ArrayList<Cour> listeCours = new ArrayList<Cour>();
        try {
            String query = "select c.nom from cour c, etudiant e where e.id_eleve='1'";
            //String query = "select c.nom from cour c, etudiant e where e.id_eleve='" + idEleve + "'";
            Connection conn = daoConnection.getConnection();
            st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery();
            while (rs.next()) {
                String nomCours = rs.getString("nom");
                //Cour c = new Cour(nomCours);
                //listeCours.add(c);
                float coeff = rs.getFloat("coefficient");
                Cour c = new Cour(nomCours, coeff);
                listeCours.add(c);
            }
            //System.out.println("L'étudiant a les cours suivants :/n");
            /*
             for (Cour cours : listeCours) {
             System.out.println(cours.getNomCour());
             }
             * */
        } finally {
            if (st != null) {
                st.close();
            }
        }
        return listeCours;
    }

    public ArrayList<Moyenne> affMoyennes(Etudiant etu, ArrayList<Cour> cours, ArrayList<Examen> examens, ArrayList<Note> notes) throws DAOEtudiantException {
        ArrayList<Moyenne> tableau = new ArrayList<Moyenne>();
        //  Etudiant etu = e.rechercheEtudiant(login, mdp);
        for (Cour cour : cours) {
            float addNote = 0;
            int nbNote = 0;
            int noCour = cour.getIdCour();
            for (Examen exam : examens) {//boucle sur tous les exam
                for (Note note : notes) {
                    if (note != null) {
                        nbNote += 1;
                        addNote += note.getNote();
                    }
                }
            }
            if (nbNote != 0) {
                tableau.add(new Moyenne(cour.getNomCour(), cour.getCoefCour(), addNote / nbNote));
            }

        }
        return tableau;
    }

    public ArrayList<Etudiant> getAllEtudiantFromCours(int id_Cour) throws DAOEtudiantException {
        String query = "SELECT id_eleve FROM `etu_cour_asso` WHERE id_cour = " + id_Cour + "";
        ArrayList<Etudiant> etu = new ArrayList<Etudiant>();
        Statement st = null;
        Etudiant etudi = null;
        int id_personne = 0;
        int id_eleve = 0;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            st = conn.createStatement();
            ResultSet res = st.executeQuery(query);

            while (res.next()) {//récuperation de l'id
                id_eleve = res.getInt("id_eleve");
                String query2 = "SELECT DISTINCT id_personne FROM etudiant WHERE id_eleve = " + id_eleve + "";
                st = conn.createStatement();
                ResultSet res2 = st.executeQuery(query2);
                while (res2.next()) {
                    id_personne = res2.getInt("id_personne");
                }
                String query3 = "SELECT DISTINCT nom, prenom FROM personne WHERE id_personne = " + id_personne + "";
                st = conn.createStatement();
                ResultSet res3 = st.executeQuery(query3);
                while (res3.next()) {
                    String nom = res3.getString("nom");
                    String prenom = res3.getString("prenom");
                    etudi = new Etudiant(id_eleve, nom, prenom);
                }
                etu.add(etudi);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return etu;
    }

    public Float moyenneGeneral(ArrayList<Moyenne> moyennes) throws DAOEtudiantException {
        int nb = 0;
        float addmoy = 0;
        for (Moyenne moyenne : moyennes) {

            addmoy = addmoy + moyenne.getMoyenne() * moyenne.getCoeff();
            nb += moyenne.getCoeff();
        }

        if (nb == 0) {
            return null;
        }
        return (addmoy / nb);
    }
}